package pers.chao.tool.encrypt;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom;

/**
 * Description: des加密解密
 *
 * @author W.Chao
 * @date 2020/11/14 18:49
 **/
public class EasyDes {
	private static final String DES = "DES";
	
	/**
	 * DES加密
	 *
	 * @param data 待加密字符串
	 * @param key  校验位
	 * @return
	 */
	@SuppressWarnings("restriction")
	protected static String encrypt(String data, String key) {
		String encryptedData = null;
		try {
			// DES算法要求有一个可信任的随机数源  
			SecureRandom sr = new SecureRandom();
			DESKeySpec deskey = new DESKeySpec(key.getBytes());
			// 创建一个密匙工厂，然后用它把DESKeySpec转换成一个SecretKey对象  
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
			SecretKey secretKey = keyFactory.generateSecret(deskey);
			// 加密对象  
			Cipher cipher = Cipher.getInstance(DES);
			cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);
			// 加密，并把字节数组编码成字符串  
			encryptedData = new sun.misc.BASE64Encoder().encode(cipher.doFinal(data.getBytes()));
		} catch (Exception e) {
			throw new RuntimeException("DES encrypt!! error: ", e);
		}
		return encryptedData;
	}

	/**
	 * DES解密
	 *
	 * @param cryptData 待解密密文
	 * @param key       校验位
	 * @return
	 */
	@SuppressWarnings("restriction")
	protected static String decrypt(String cryptData, String key) {
		String decryptedData = null;
		try {
			// DES算法要求有一个可信任的随机数源  
			SecureRandom sr = new SecureRandom();
			DESKeySpec deskey = new DESKeySpec(key.getBytes());
			// 创建一个密匙工厂，然后用它把DESKeySpec转换成一个SecretKey对象  
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
			SecretKey secretKey = keyFactory.generateSecret(deskey);
			// 解密对象  
			Cipher cipher = Cipher.getInstance(DES);
			cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);
			// 把字符串解码为字节数组，并解密  
			decryptedData = new String(cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(cryptData)));
		} catch (Exception e) {
			throw new RuntimeException("DES decrypt!! error: ", e);
		}
		return decryptedData;
	}
}
